import { PrismaClient } from '@prisma/client';
import * as bcrypt from 'bcrypt';
import * as readline from 'readline';

const prisma = new PrismaClient();

/**
 * 创建初始管理员账号脚本
 * 用于在数据库中创建第一个管理员用户
 */
async function createAdmin() {
  const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
  });

  const question = (query: string): Promise<string> => {
    return new Promise((resolve) => {
      rl.question(query, resolve);
    });
  };

  try {
    console.log('\n=== 创建管理员账号 ===\n');

    // 获取用户名
    const username = await question('请输入管理员用户名: ');
    if (!username || username.trim().length === 0) {
      console.error('❌ 用户名不能为空');
      process.exit(1);
    }

    // 检查用户名是否已存在
    const existingUser = await prisma.user.findFirst({
      where: { username: username.trim() }
    });

    if (existingUser) {
      console.error(`❌ 用户名 "${username}" 已存在`);
      process.exit(1);
    }

    // 获取密码
    const password = await question('请输入管理员密码 (至少6位): ');
    if (!password || password.length < 6) {
      console.error('❌ 密码至少需要6位');
      process.exit(1);
    }

    // 确认密码
    const confirmPassword = await question('请再次输入密码: ');
    if (password !== confirmPassword) {
      console.error('❌ 两次输入的密码不一致');
      process.exit(1);
    }

    // 加密密码
    console.log('\n正在加密密码...');
    const hashedPassword = await bcrypt.hash(password, 10);

    // 生成唯一的管理员openid (使用admin_前缀 + 时间戳)
    const adminOpenid = `admin_${Date.now()}_${Math.random().toString(36).substring(7)}`;

    // 创建管理员用户
    console.log('正在创建管理员账号...');
    const admin = await prisma.user.create({
      data: {
        openid: adminOpenid,
        username: username.trim(),
        password: hashedPassword,
        nickname: `管理员-${username}`,
        role: 'ADMIN'
      }
    });

    console.log('\n✅ 管理员账号创建成功！');
    console.log('\n账号信息:');
    console.log(`  用户ID: ${admin.id}`);
    console.log(`  用户名: ${admin.username}`);
    console.log(`  角色: ${admin.role}`);
    console.log(`  创建时间: ${admin.createdAt}`);
    console.log('\n请妥善保管您的登录凭证！\n');

  } catch (error) {
    console.error('\n❌ 创建管理员失败:', error);
    process.exit(1);
  } finally {
    rl.close();
    await prisma.$disconnect();
  }
}

// 执行脚本
createAdmin()
  .then(() => {
    process.exit(0);
  })
  .catch((error) => {
    console.error('脚本执行失败:', error);
    process.exit(1);
  });
